#include <iostream>
#include <pthread.h>
#include <string>
#include <unistd.h>
using namespace std;

// 创建线程——pthread_create
// void* threadRoutine(void* args)
// {
//     while(true)
//     {
//         cout << "new thread, pid: " << getpid() << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t pid;
//     pthread_create(&pid, nullptr, threadRoutine, nullptr);    // 第四个参数需要就设置，不需要就设Nullptr
//     while(true)
//     {
//         cout << "main thread, pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }


// 全局资源——线程间共享
// int g_val = 100;

// void* threadRoutine(void* args)
// {
//     const char* name = (const char*)args;   //通过参数获取到对应的字符串
//     while(true)
//     {
//         printf("%s, pid: %d, g_val: %d, &g_val: 0x%p\n", name, getpid(), g_val, &g_val);
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"new thread");
    
//     while(true)
//     {
//         printf("main thread, pid: %d, g_val: %d, &g_val: 0x%p, create new thread tid: %p\n", getpid(), g_val, &g_val, tid);
//         sleep(1);
//         g_val++;
//     }
//     return 0;
// }


// 线程等待
// 线程终止
// 线程取消
// 全局函数在线程间共享
int g_val = 100;

void Show(const string& name)
{
    cout << name << " say@ I am a thread" << endl;
}

void* threadRoutine(void* args)
{
    const char* name = (const char*)args;
    int cnt = 5;
    while(cnt--)
    {
        // printf("%s, pid: %d, g_val: %d, &g_val: 0x%p\n", name, getpid(), g_val, &g_val);
        Show("[new thread]");
        sleep(1);
    }
    pthread_exit((void*)100);
    return (void*)66;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, (void*)"new thread");

    while(true)
    {
        // printf("main thread, pid: %d, g_val: %d, &g_val: 0x%p, create new thread tid: %p\n", getpid(), g_val, &g_val, tid);
        Show("[main thread]");
        sleep(1);
    }

    sleep(3);
    pthread_cancel(tid);    // 取消主线程

    void* ret;
    pthread_join(tid, &ret);
    cout << "main thread quit, new thread return mes: " << (long long int)ret << endl;
    return 0;
}